package com.luych.toolbox.data.service.core;

import com.luych.toolbox.common.enums.CaseType;
import com.luych.toolbox.common.enums.DataSourceType;

public interface CoreColumn {

    DataSourceType getDataSourceType();

    String getOwner();

    String getName();

    CoreDataType getDataType();

    default String getColumnType(){
        if (this.getDataType().supportCharLength()) {
            if (this.getCharLength() == null) {
                return this.getDataType().getName();
            } else {
                return this.getDataType().getName() + "(" + this.getCharLength() + ")";
            }
        } else if (this.getDataType().supportNumericPrecision() && this.getDataType().supportNumericScale()) {
            if (this.getNumericPrecision() == null) {
                return this.getDataType().getName();
            } else if (this.getNumericScale() == null) {
                return this.getDataType().getName() + "(" + this.getNumericPrecision() + ")";
            } else {
                return this.getDataType().getName() + "(" + this.getNumericPrecision() + ", " + this.getNumericScale() + ")";
            }
        } else if (this.getDataType().supportNumericPrecision()) {
            if (this.getNumericPrecision() == null) {
                return this.getDataType().getName();
            } else {
                return this.getDataType().getName() + "(" + this.getNumericPrecision() + ")";
            }
        } else {
            return this.getDataType().getName();
        }
    }

    Long getCharLength();

    Long getNumericPrecision();

    Long getNumericScale();

    Boolean isNullable();

    String getComment();

    Boolean isIncrement();

    String getCreateSql(CaseType caseType);

    String getModifySql(CaseType caseType);

    default String getRemoveSql(CaseType caseType) {
        return "ALTER TABLE " + caseType.getConvert().apply(this.getOwner()) +
                " DROP COLUMN " + caseType.getConvert().apply(this.getName()) + ";";
    }

}
